<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="../../../lib/jquery-1.8.3.js"></script>
</head>
<body>
<div id="testEl"></div>
<script type="text/javascript">
    /**
     * 1.jquery的data将数据绑到普通的object上
     */
    var obj = {
        name:'desk'
    };
    $.data(obj, 'size', '1.2');
    console.log($.data(obj, 'size'));
    function getUid() {
        return 'jq' + (+new Date);
    }

    var cache1 = {
        cache:'jq' + (+new Date),
        set:function (obj, name, value) {
            obj[this.cache] = obj[this.cache] || {};
            obj[this.cache][name] = value;
        },
        get:function (obj, name) {
            if (typeof name == 'undefined') {
                return obj[this.cache];
            }
            return obj[this.cache][name];
        }
    };
    /**
     * Testing 1:
     */
    /*
     cache1.set(obj,'size2','1.2-afei');
     cache1.set(obj,'size3','1.3-afei');
     */

    /**
     * 1.由于这个cache方法在element绑属性的时候，会造成内存泄漏?(何以证明？)
     * 2.处理内存泄漏的办法如下：
     * a.创建一个全局的globalCache={};
     * b.针对要存数据的element附加jq232432424
     * c.同上存数据即可
     */
    /**
     *
     jQuery 的注释有说明，
     We have to handle DOM nodes and JS objects differently because IE6-7
     can't GC object references properly across the DOM-JS boundary

     IE6、IE7 中， 直接把 object 作为属性附加到 DOM Element 上，
     那么这个 objet 占用的内存将不会被有效地回收。

     所以 data() 函数的实现中只在 DOM Elemet 上存了一个 ID 。
     * @type {Object}
     */
    var cache2 = {
        expando:'jq' + (+new Date),
        uid:0,
        globalCache:{},
        set:function (obj, name, value) {
            obj[this.expando] = obj[this.expando] || {};
            obj[this.expando][name] = value;
        },
        get:function (obj, name) {
            if (typeof name == 'undefined') {
                return obj[this.expando];
            }
            return obj[this.expando][name];
        },
        /**
         *
        虽然说不给element上添加大量数据，但实际上还是给这些元素上添加了element.jq2214234=1;这种数据
         只是这种数据都是值类型，在内存里也不会占太多空间，对性能影响就会相对减小
         */
        setDataForElement:function (element, name, value) {
            var id=element[this.expando] = element[this.expando] || ++this.uid;//给element上加个jq12412412为一个值 ：1、2这种简单的串
            this.globalCache[id]=this.globalCache[id] || {};
            this.globalCache[id][name]=value;
        },
        getDataFromElement:function (element, name) {
            if(typeof name=='undefined'){
                return this.globalCache[this.uid];
            }
            return this.globalCache[this.uid][name];
        }
    };

    /**
     * Test2ing....
     */
    /*
    cache2.setDataForElement($('#testEl')[0],'afei1','afeiv1----');
    cache2.setDataForElement($('#testEl')[0],'afei2','afeiv2----');
    */


</script>
</body>
</html>